// import {
//   Injectable,
//   NestInterceptor,
//   ExecutionContext,
//   CallHandler,
// } from '@nestjs/common';
// import { Observable } from 'rxjs';
// import { tap, map } from 'rxjs/operators';
// import { DatasourceService } from 'src/datasource/datasource.service';
// import { getConnection } from 'src/datasource/db/mysql';

// @Injectable()
// export class SqlExecInterceptor implements NestInterceptor {
//   constructor(private readonly datasourceService: DatasourceService) {}

//   async intercept(
//     context: ExecutionContext,
//     next: CallHandler,
//   ): Promise<Observable<any>> {
//     const [request] = context.getArgs();
//     // const record = await this.datasourceService.findDataServer(
//     //   request.body.serverId,
//     // );
//     const params = request.body;
//     const utils = await this.createUtils(params);
//     await this.beforeSql(params, utils);
//     return next.handle().pipe(
//       map(async (data) => {
//         // await this.afterSql( data, utils);
//         this.destroyUtils(utils);
//         return data;
//       }),
//     );
//   }

//   async createUtils(record) {
//     const utils: any = {};
//     // 如果指定数据库服务，则默认带上数据库服务连接
//     const server = await this.datasourceService.findDataServer(record.serverId);
//     utils.conn = await getConnection(server);
//     return utils;
//   }

//   destroyUtils(utils) {
//     // 释放数据库连接
//     utils.conn?.release?.();
//   }

//   /**
//    * 比如修改 function beforeSql(data, utils){data.$0='090'} 可以直接修改参数
//    * @param data
//    * @param utils
//    */
//   async beforeSql(params, utils) {
//     // if (!record.open) return;
//     // if (record.beforeSql.trim()) {
//     //   const fn = new Function(
//     //     'data',
//     //     'utils',
//     //     `return (${record.beforeSql})(data, utils)`,
//     //   );
//     //   await fn(data, utils);
//     // }
//     // await createNodeNewFunction()
//   }

//   /**
//    * 比如修改 function afterSql(data, utils){data[0]=1} 可以直接修改返回值
//    * @param data
//    * @param utils
//    */
//   async afterSql(record, data, utils) {
//     if (!record.open) return;
//     if (record.afterSql.trim()) {
//       const fn = new Function(
//         'data',
//         'utils',
//         `return (${record.afterSql})(data, utils)`,
//       );
//       await fn(data, utils);
//     }
//   }
// }
